package myjava.overriding;

public class Root1 {

   public static void main(String[] args) {

      Son ss = new Son();
      Dad ds = new Son();

      // NOTA: la JVM comunque sa che o2 e' in effetti un Son e in effetti
      // esegue il sayHello di Son e non quello di Dad a RUNTIME
      ss.sayHello();
      ds.sayHello();

      // MA ATTENZIONE ... con gli attributi tale arguzia non funziona!
      System.out.println(ss.age);
      System.out.println(ds.age);
   }
}

class Dad {

   public int age = 50;

   protected void sayHello() {
      System.out.println("Hi I am Dad!");
   }
}

/*
   si fa l'override di un metodo DI ISTANZA della classe base
   quando si riscrive nella sottoclasse un metodo DI ISTANZA con
   ugual nome e stessa signature!

   si puo' inoltre allargare (MA MAI RESTRINGERE) la visibilita' del metodo di cui si esegue
   l'override - tipo da proteceted a public

   MIND: il metodo della classe base rimane raggiungibile via # super # */

class Son extends Dad {

   public int age = 30;

   @Override
   public void sayHello() {
      System.out.println("Hi I am Son!");
      // to access Dad's one
      // super.sayHello();
   }
}